package com.example.rabbitmq.demo3_pub_and_returned_confirm;

import com.example.rabbitmq.enums.ExchangeEnum;
import com.example.rabbitmq.enums.RoutingKeyEnum;
import com.rabbitmq.client.*;

import java.nio.charset.StandardCharsets;

public class Producer {

    public static void buildMessage(Channel channel) throws Exception {
        //开启发布确认模式
        channel.confirmSelect();
        //单个消息发布
//        for (int i=1; i<11; i++) {
//            //发送消息
//            /*
//             * 参数一: 交换机名称
//             * 参数二: 交换机路由key值
//             * 参数三: 额外参数
//             * 参数四: 消息
//             * */
//            channel.basicPublish(ExchangeEnum.NORMAL_EXCHANGE.name, RoutingKeyEnum.NORMAL.name(),null, ("message"+i).getBytes(StandardCharsets.UTF_8));
//            if(channel.waitForConfirms()){
//                System.out.println("success send message "+i);
//            }else {
//                System.out.println("fail send message "+i);
//            }
//        }

//        //批量消息发布
//        for (int i=1; i<11; i++) {
//            //发送消息
//            /*
//             * 参数一: 交换机名称
//             * 参数二: 交换机路由key值
//             * 参数三: 额外参数
//             * 参数四: 消息
//             * */
//            channel.basicPublish(ExchangeEnum.NORMAL_EXCHANGE.name, RoutingKeyEnum.NORMAL.name(),null, ("message"+i).getBytes(StandardCharsets.UTF_8));
//
//        }
//        if(channel.waitForConfirms()){
//            System.out.println("success send message");
//        }else {
//            System.out.println("fail send message");
//        }
//
//        //异步消息发布
        ConfirmListener confirmListener = new ConfirmListenerImpl();
        channel.addConfirmListener(confirmListener);
        channel.addReturnListener((returnMessage)->{
            //打印失败原因
            System.out.println("消息回退: 回退代码: "+returnMessage.getReplyCode()+"; 回退原因: "+returnMessage.getReplyText());
        });
        for (int i=1; i<11; i++) {
            //发送消息
            /*
             * 参数一: 交换机名称
             * 参数二: 交换机路由key值
             * 参数三：交换机无法路由到queue，消息是否回退
             * 参数四: queue没有连接消费者，队列是否清除该消息并将消息回退
             * 参数五: 扩展参数
             * 参数六: 消息
             * */
//            channel.basicPublish(ExchangeEnum.NORMAL_EXCHANGE.name, RoutingKeyEnum.NORMAL.name(),true, false,null, ("message"+i).getBytes(StandardCharsets.UTF_8));

            channel.basicPublish(ExchangeEnum.NORMAL_EXCHANGE.name, "none_exists",true, false,null, ("message"+i).getBytes(StandardCharsets.UTF_8));
//            channel.basicPublish("none_exists", "none_exists",true, false,null, ("message"+i).getBytes(StandardCharsets.UTF_8));
            System.out.println("发送消息:"+i);
        }
        System.out.println("发送完毕");
    }
}